/*
 * Licensed to the 南京汇海交通科技有限公司
 *
 * Copyright (c) 2025.
 * All rights reserved.
 *
 * 本软件属南京汇海交通科技有限公司所有，在未获得南京汇海交通科技有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.chframework.http.utility;

import com.chframework.http.utility.constant.BatchReturnEnum;
import com.chframework.http.utility.constant.DataParseTypeEnum;
import com.chframework.http.utility.constant.ResponseBodyDataTypeEnum;
import lombok.Getter;
import lombok.Setter;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;

import java.io.Serializable;
import java.util.List;

@Getter
@Setter
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class ServiceConfigInfo implements Serializable {
    /**
     * 服务请求配置
     */
    private ServiceRequestConfigInfo serviceRequestConfigInfo;
    /**
     * 服务响应配置
     */
    private ServiceResponseConfigInfo serviceResponseConfigInfo;

    /**
     * 网络服务请求配置
     */
    @Getter
    @Setter
    @EqualsAndHashCode
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ServiceRequestConfigInfo implements Serializable {
        /**
         * 请求方式 [GET/POST]
         */
        private String requestMethod;
        /**
         * 请求地址 [http(s)://{ip}:{port}/{api-url}]
         */
        private String requestUrl;
        /**
         * 文本类型 [application/x-www-form-urlencoded、application/json、multipart/form-data]
         */
        private String contentType;
        /**
         * HTTP POST JSON格式请求体
         */
        private String requestBody;
        /**
         * HTTP请求头参数列表
         */
        private List<ParamProperty> headerParamConfig;
        /**
         * URL查询参数列表
         */
        private List<ParamProperty> queryParamConfig;
        /**
         * Form表单提交参数列表
         */
        private List<ParamProperty> formParamConfig;
        /**
         * 请求体JSON报文中占位符参数列表
         */
        private List<ParamProperty> jsonParamConfig;
    }

    /**
     * 网络服务响应配置
     */
    @Getter
    @Setter
    @EqualsAndHashCode
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ServiceResponseConfigInfo implements Serializable {
        /**
         * 映射业务数据的根路径，依据该路径的字符特征可判断是否在解析json数组
         */
        private String rootMapPath;
        /**
         * 是否分批返回：Y-是，N-否
         */
        private BatchReturnEnum batchReturn;
        /**
         * 表示“当前页码”的Key在JSON文档中的路径(要求batch_return设置为Y)
         */
        private String currentPageKey;
        /**
         * 表示“总页数”的Key在JSON文档中的路径(要求batch_return设置为Y)
         */
        private String totalPageKey;
        /**
         * 分批返回时的“起始页码”
         */
        private Long startPageNo;
        /**
         * 响应数据的解析方式：A - AES解析，B64 - BASE64解码
         */
        private DataParseTypeEnum dataParseType;
        /**
         * 响应内容的数据格式：J - JSON格式，T - Text文本格式，X - XML格式
         */
        private ResponseBodyDataTypeEnum responseBodyDataType;
        /**
         * 用于解密或解码的秘钥
         */
        private String decryptKey;
        /**
         * 响应内容的字段映射关系
         */
        private List<ParamProperty> mappingParamConfig;
    }

    /**
     * 参数配置
     */
    @Getter
    @Setter
    @Builder
    @EqualsAndHashCode
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ParamProperty implements Serializable {
        /**
         * Key
         */
        protected String sourceParamPath;
        /**
         * Value
         */
        protected String sourceParamValue;
        /**
         * Value type
         */
        protected String sourceParamType;
        /**
         * DSM系统中的字段名
         */
        private String targetFieldName;
        /**
         * 该字段DSM系统中的业务描述
         */
        private String targetFieldDesc;
    }
}
